SparseFillEmptyRows

对稀疏张量按行进行补全操作。当某一行在输入稀疏表示中不存在非零元素时, 使用给定的 default_value 为该行补充一个元素,并生成新的稀疏表示结果。 同时可选地输出反向索引映射关系。

该算子常用于保证稀疏张量在行维度上的完备性。

\[\text{if row } r \text{ is empty:} \quad (r, 0, \dots) \rightarrow default\_value\]
输入:
  • N - 输入稀疏元素个数。

  • rank - 稀疏张量的秩(索引维度)。

  • dense_rows - 稠密行数。

  • indices_ptr - 输入稀疏索引数组地址,大小为 N × rank

  • values_ptr - 输入稀疏值数组地址。

  • default_value - 用于填充空行的默认值。

  • scratch_ptr - 中间缓冲区,用于存放前缀和信息。

  • output_reverse_index_map_ptr - 反向索引映射输出地址(可为 NULL)。

  • core_mask - 核掩码(仅共享存储版本需要)。

输出:
  • output_y_indices_ptr - 输出稀疏索引数组地址。

  • output_y_values_ptr - 输出稀疏值数组地址。

  • filled_count - 每一行填充计数结果。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持fp, dp, int8, int16, int32, cplx64, cplx128

  • MT7004 支持hp, fp, int16, int32, cplx64

共享存储版本:

void i8_sparsefillemptyrows_s(int N, int rank, int dense_rows, int *indices_ptr, int8_t *values_ptr, int8_t default_value, int *scratch_ptr, int *output_y_indices_ptr, int8_t *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count, int core_mask)
void i16_sparsefillemptyrows_s(int N, int rank, int dense_rows, int *indices_ptr, int16_t *values_ptr, int16_t default_value, int *scratch_ptr, int *output_y_indices_ptr, int16_t *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count, int core_mask)
void i32_sparsefillemptyrows_s(int N, int rank, int dense_rows, int *indices_ptr, int32_t *values_ptr, int32_t default_value, int *scratch_ptr, int *output_y_indices_ptr, int32_t *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count, int core_mask)
void hp_sparsefillemptyrows_s(int N, int rank, int dense_rows, int *indices_ptr, half *values_ptr, half default_value, int *scratch_ptr, int *output_y_indices_ptr, half *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count, int core_mask)
void fp_sparsefillemptyrows_s(int N, int rank, int dense_rows, int *indices_ptr, float *values_ptr, float default_value, int *scratch_ptr, int *output_y_indices_ptr, float *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count, int core_mask)
void dp_sparsefillemptyrows_s(int N, int rank, int dense_rows, int *indices_ptr, double *values_ptr, double default_value, int *scratch_ptr, int *output_y_indices_ptr, double *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count, int core_mask)
void c64_sparsefillemptyrows_s(int N, int rank, int dense_rows, int *indices_ptr, float *values_ptr, float default_value, int *scratch_ptr, int *output_y_indices_ptr, float *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count, int core_mask)
void c128_sparsefillemptyrows_s(int N, int rank, int dense_rows, int *indices_ptr, double *values_ptr, double default_value, int *scratch_ptr, int *output_y_indices_ptr, double *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count, int core_mask)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <sparsefillemptyrows.h>
 4
 5int main(int argc, char* argv[]) {
 6    int N = 4, rank = 2, dense_rows = 6;
 7    int *indices = (int *)0xA0000000;
 8    float *values = (float *)0xA0010000;
 9    float default_value = 0.0f;
10    int *scratch = (int *)0xA0020000;
11    int *out_indices = (int *)0xC0000000;
12    float *out_values = (float *)0xC0010000;
13    int *reverse_map = (int *)0xC0020000;
14    int *filled_count = (int *)0xC0030000;
15    int core_mask = 0xff;
16
17    fp_sparsefillemptyrows_s(
18        N, rank, dense_rows,
19        indices, values, default_value,
20        scratch, out_indices, out_values,
21        reverse_map, filled_count, core_mask);
22
23    return 0;
24}

私有存储版本:

void i8_sparsefillemptyrows_p(int N, int rank, int dense_rows, int *indices_ptr, int8_t *values_ptr, int8_t default_value, int *scratch_ptr, int *output_y_indices_ptr, int8_t *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count)
void i16_sparsefillemptyrows_p(int N, int rank, int dense_rows, int *indices_ptr, int16_t *values_ptr, int16_t default_value, int *scratch_ptr, int *output_y_indices_ptr, int16_t *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count)
void i32_sparsefillemptyrows_p(int N, int rank, int dense_rows, int *indices_ptr, int32_t *values_ptr, int32_t default_value, int *scratch_ptr, int *output_y_indices_ptr, int32_t *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count)
void hp_sparsefillemptyrows_p(int N, int rank, int dense_rows, int *indices_ptr, half *values_ptr, half default_value, int *scratch_ptr, int *output_y_indices_ptr, half *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count)
void fp_sparsefillemptyrows_p(int N, int rank, int dense_rows, int *indices_ptr, float *values_ptr, float default_value, int *scratch_ptr, int *output_y_indices_ptr, float *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count)
void dp_sparsefillemptyrows_p(int N, int rank, int dense_rows, int *indices_ptr, double *values_ptr, double default_value, int *scratch_ptr, int *output_y_indices_ptr, double *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count)
void c64_sparsefillemptyrows_p(int N, int rank, int dense_rows, int *indices_ptr, float *values_ptr, float default_value, int *scratch_ptr, int *output_y_indices_ptr, float *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count)
void c128_sparsefillemptyrows_p(int N, int rank, int dense_rows, int *indices_ptr, double *values_ptr, double default_value, int *scratch_ptr, int *output_y_indices_ptr, double *output_y_values_ptr, int *output_reverse_index_map_ptr, int *filled_count)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <sparsefillemptyrows.h>
 4
 5int main(int argc, char* argv[]) {
 6    int N = 4, rank = 2, dense_rows = 6;
 7    int *indices = (int *)0x10810000;
 8    float *values = (float *)0x10820000;
 9    float default_value = 0.0f;
10    int *scratch = (int *)0x10830000;
11    int *out_indices = (int *)0x10840000;
12    float *out_values = (float *)0x10850000;
13    int *filled_count = (int *)0x10860000;
14
15    fp_sparsefillemptyrows_p(
16        N, rank, dense_rows,
17        indices, values, default_value,
18        scratch, out_indices, out_values,
19        NULL, filled_count);
20
21    return 0;
22}